using Sinacor.Infra.UI.Common;

namespace Sinacor.UI.Bovespa.Parametro.Presenter
{
    public class CadastroParametroBolsa : BasePresenter<ICadastroParametroBolsa>
    {
        private Communication.Mensagem _communicationMensagem;
		private Communication.ParametroBolsa _communicationParametroBolsa;

        private bool _diariamente;
        private bool _mensalmente;
        private bool _anualmente;
        private bool _zeraNota;
        private bool _integraContaCorrente = false; 

        private ModelCollection<Model.Mensagem> _listaMensagens;
		private ModelCollection<Model.TipoNota> _listaTiposNotas;
		
		private Model.ParametroBolsa _parametroBolsa;
		private Model.TipoNota _tipoNota;
        private Model.Parameter.FiltroMensagemJustificativaObservacao _filtroMensagemJustificativaObservacao;
        private Model.Parameter.FiltroTipoNota _filtroTipoNota; 

        public CadastroParametroBolsa(ICadastroParametroBolsa view)
            : base(view) { }

        #region Propriedades

        public bool Mensalmente
        {
            get
            {
                return _mensalmente;
            }
            set
            {
                _mensalmente = value;
            }
        }

        public bool Anualmente{
			get{
				return _anualmente;
			}
			set{
				_anualmente = value;
			}
		}

        public bool Diariamente
        {
            get
            {
                return _diariamente;
            }
            set
            {
                _diariamente = value;
            }
        }

        public bool ZeraNota
        {
            get
            {
                return _zeraNota;
            }
            set
            {
                _zeraNota = value;
            }
        }

        public Model.Parameter.FiltroTipoNota FiltroTipoNota
        {
            get{ return _filtroTipoNota; }
            set { _filtroTipoNota = value; }
        }
        
        public Model.TipoNota TipoNota
        {
            get { return _tipoNota; }
            set { _tipoNota = value; }
        }

        public Model.Parameter.FiltroMensagemJustificativaObservacao FiltroMensagemJustificativaObservacao
        {
            get { return _filtroMensagemJustificativaObservacao; }
            set { _filtroMensagemJustificativaObservacao = value; }
        }

        public Model.ParametroBolsa ParametroBolsa
        {
            get { return _parametroBolsa; }
            set { _parametroBolsa = value; }
        }

        public ModelCollection<Model.Mensagem> ListaMensagens
        {
            get { return _listaMensagens; }
            set { _listaMensagens = value; }
        }

        public ModelCollection<Model.TipoNota> ListaTiposNotas
        {
            get { return _listaTiposNotas; }
            set { _listaTiposNotas = value; }
        }

        #endregion 

		public void Cancelar()
        {
            this.Inicializar();
		}

		public void ConsultarMensagensJustificativaObservacao()
        {
            _communicationMensagem = new Communication.Mensagem(this.Session);
            _listaMensagens =_communicationMensagem.ConsultarMensagensJustificativaObservacao(_filtroMensagemJustificativaObservacao);            
		}

        public void ConsultarTiposNotas()
        {
            _filtroTipoNota = new Sinacor.UI.Bovespa.Parametro.Model.Parameter.FiltroTipoNota();            
            _filtroTipoNota.Cpmf = false;

            _communicationParametroBolsa = new Communication.ParametroBolsa(this.Session);
            _listaTiposNotas =_communicationParametroBolsa.ConsultarTiposNotas(_filtroTipoNota);
		}
		
		public void Inicializar()
        {
            _listaMensagens = new ModelCollection<Sinacor.UI.Bovespa.Parametro.Model.Mensagem>();
            _listaTiposNotas = new ModelCollection<Sinacor.UI.Bovespa.Parametro.Model.TipoNota>();

            this.VerificarExistenciaModuloContaCorrente();

            if (!this._integraContaCorrente)
                this.View.DesabilitarIntegraSistemaContasCorrentes();

            this.View.AtualizaIntegraContasCorrentes(_integraContaCorrente);

            this._filtroMensagemJustificativaObservacao = new Sinacor.UI.Bovespa.Parametro.Model.Parameter.FiltroMensagemJustificativaObservacao();
            this._filtroMensagemJustificativaObservacao.TipoSistema = Model.Enum.TipoSistema.Faturamento;
 
            this.ConsultarMensagensJustificativaObservacao();
            this.View.AtualizarMensagem();

            this.ObterParametroBolsa();
            this.View.AtualizarParametroBolsa();

            this.ConsultarTiposNotas();
            this.View.AtualizarTipoNota();                        
		}

        public void ObterParametroBolsa()
        {
            _communicationParametroBolsa = new Sinacor.UI.Bovespa.Parametro.Communication.ParametroBolsa(this.Session);
            this._parametroBolsa = _communicationParametroBolsa.ObterParametroBolsa();
           
            switch (this._parametroBolsa.ZeraNota)
            {
                case Model.Enum.TipoPeriodo.Nenhum:
                    {
                        _zeraNota = false;
                        _anualmente = false;
                        _diariamente = false;
                        _mensalmente = false;
                        this.View.DesabilitarZeraNota();
                        break;
                    }
                case Model.Enum.TipoPeriodo.Anualmente:
                    {
                        _zeraNota = true;
                        _diariamente = false;
                        _mensalmente = false;
                        _anualmente = true;
                        this.View.HabilitarZeraNota();
                        break;
                    }
                case Model.Enum.TipoPeriodo.Diariamente:
                    {
                        _zeraNota = true;
                        _anualmente = false;
                        _mensalmente = false;
                        _diariamente = true;
                        this.View.HabilitarZeraNota();
                        break;
                    }
                case Model.Enum.TipoPeriodo.Mensalmente:
                    {
                        _zeraNota = true;
                        _anualmente = false;
                        _diariamente = false;
                        _mensalmente = true;
                        this.View.HabilitarZeraNota();
                        break;
                    }
            }
		}

		public void Salvar()
        {
            if (this.ValidarParametroBolsa())
            {
                if (_zeraNota == false)
                {
                    ParametroBolsa.ZeraNota = Model.Enum.TipoPeriodo.Nenhum;
                }
                else
                {
                    if (_anualmente == true)
                    {
                        ParametroBolsa.ZeraNota = Model.Enum.TipoPeriodo.Anualmente;
                    }
                    else if (_diariamente == true)
                    {
                        ParametroBolsa.ZeraNota = Model.Enum.TipoPeriodo.Diariamente;
                    }
                    else if (_mensalmente == true)
                    {
                        ParametroBolsa.ZeraNota = Model.Enum.TipoPeriodo.Mensalmente;
                    }
                }

                Communication.ParametroBolsa _communicationParametroBolsa = new Sinacor.UI.Bovespa.Parametro.Communication.ParametroBolsa(this.Session);
                _communicationParametroBolsa.AtualizarParametroBolsa(ParametroBolsa, ListaTiposNotas);

                this.View.InformarAtualizacaoParametroSucesso();
            }
        }

		public bool ValidarParametroBolsa()
        {
            bool isValido = true;

            if (!ParametroBolsa.UltimaNotaEmitida.HasValue)
            {
                this.View.InformarNumeroUltimaNotaObrigatorio();
                isValido = false;
            }

            if (!string.IsNullOrEmpty(ParametroBolsa.CaminhoNota))
            {
                if (ParametroBolsa.CaminhoNota.Length > 150)
                {
                    this.View.InformarTamanhoMaximoCaminhoNota();
                    isValido = false;
                }
            }

            return isValido;
		}

		public void VerificarExistenciaModuloContaCorrente()
        {
            _integraContaCorrente = (new Sinacor.UI.Bovespa.Parametro.Communication.Acesso(this.Session)).VerificarSistemaInstalado("CCO");
		}


	}
}